ãŠããããçµ±åããšã³ãããŒãšã³ããã¹ãã®è©³çŽ°ãªæ¯èŒã§JavaScriptã®ãã¹ãããã¹ã¿ãŒãå ç¢ãªãœãããŠã§ã¢ã®ããã«åã¢ãããŒãããã€ãã©ã®ããã«äœ¿çšããããåŠã³ãŸãããã
JavaScriptã®ãã¹ãïŒãŠããã vs çµ±å vs E2E - å æ¬çã¬ã€ã
ãã¹ãã¯ãœãããŠã§ã¢éçºã«ãããŠæ¥µããŠéèŠãªåŽé¢ã§ãããJavaScriptã¢ããªã±ãŒã·ã§ã³ã®ä¿¡é Œæ§ãå®å®æ§ãä¿å®æ§ãä¿èšŒããŸããé©åãªãã¹ãæŠç¥ãéžæããããšã¯ãéçºããã»ã¹ã®å質ãšå¹çã«å€§ãã圱é¿ããŸãããã®ã¬ã€ãã§ã¯ãJavaScriptã®3ã€ã®åºæ¬çãªãã¹ãã¿ã€ããããªãã¡ãŠããããã¹ããçµ±åãã¹ãããšã³ãããŒãšã³ãïŒE2EïŒãã¹ãã®å æ¬çãªæŠèŠã説æããŸããããããã®éããå©ç¹ãå®è·µçãªå¿çšãæ¢æ±ãããã¹ãã¢ãããŒãã«ã€ããŠæ å ±ã«åºã¥ããæææ±ºå®ãã§ããããã«ããŸãã
ãªããã¹ãã¯éèŠãªã®ãïŒ
åãã¹ãã¿ã€ãã®è©³çްã«å ¥ãåã«ããŸããã¹ãå šè¬ã®éèŠæ§ã«ã€ããŠç°¡åã«èª¬æããŸãã
- æ©æã®ãã°çºèŠïŒ éçºã©ã€ããµã€ã¯ã«ã®æ©ã段éã§ãã°ãç¹å®ãä¿®æ£ããããšã¯ãæ¬çªç°å¢ã§å¯ŸåŠãããããå€§å¹ ã«å®äŸ¡ã§ç°¡åã§ãã
- ã³ãŒãå質ã®åäžïŒ ãã¹ããæžãããšã¯ãããã¯ãªãŒã³ã§ãã¢ãžã¥ãŒã«åãããä¿å®ããããã³ãŒããæžãããšã奚å±ããŸãã
- ä¿¡é Œæ§ã®ç¢ºä¿ïŒ ãã¹ãã¯ãã³ãŒããæ§ã ãªæ¡ä»¶äžã§æåŸ ã©ããã«åäœãããšããèªä¿¡ãäžããŸãã
- ãªãã¡ã¯ã¿ãªã³ã°ã®ä¿é²ïŒ å æ¬çãªãã¹ãã¹ã€ãŒããããã°ããªã°ã¬ãã·ã§ã³ãè¿ éã«ç¹å®ã§ãããããããèªä¿¡ãæã£ãŠã³ãŒãããªãã¡ã¯ã¿ãªã³ã°ã§ããŸãã
- ã³ã©ãã¬ãŒã·ã§ã³ã®æ¹åïŒ ãã¹ãã¯ããã¥ã¡ã³ããšããŠæ©èœããã³ãŒããã©ã®ããã«äœ¿çšãããããšãæå³ããŠãããã瀺ããŸãã
ãŠããããã¹ã
ãŠããããã¹ããšã¯äœãïŒ
ãŠããããã¹ãã¯ãã³ãŒãã®åã ã®ãŠããããã³ã³ããŒãã³ããåé¢ããŠãã¹ãããããšã§ããããŠãããããšã¯éåžžã颿°ãã¡ãœããããŸãã¯ã¯ã©ã¹ãæããŸããç®æšã¯ãã·ã¹ãã ã®ä»ã®éšåããç¬ç«ããŠãåãŠããããæå³ããæ©èœãæ£ããå®è¡ããããšã確èªããããšã§ãã
ãŠããããã¹ãã®å©ç¹
- æ©æã®ãã°çºèŠïŒ ãŠããããã¹ãã¯éçºã®æãæ©ã段éã§ãã°ãç¹å®ããã®ã«åœ¹ç«ã¡ãããããã·ã¹ãã ã®ä»ã®éšåã«åºããã®ãé²ããŸãã
- è¿ éãªãã£ãŒãããã¯ã«ãŒãïŒ ãŠããããã¹ãã¯éåžžãå®è¡ãéããã³ãŒãã®å€æŽã«å¯ŸããŠè¿ éãªãã£ãŒãããã¯ãæäŸããŸãã
- ã³ãŒãèšèšã®æ¹åïŒ ãŠããããã¹ããæžãããšã¯ãã¢ãžã¥ãŒã«åããããã¹ãå¯èœãªã³ãŒããæžãããšã奚å±ããŸãã
- ãããã°ã®å®¹æãïŒ ãŠããããã¹ãã倱æããå Žåãåé¡ã®åå ãç¹å®ããã®ã¯æ¯èŒçç°¡åã§ãã
- ããã¥ã¡ã³ããŒã·ã§ã³ïŒ ãŠããããã¹ãã¯çããããã¥ã¡ã³ããšããŠæ©èœããåã ã®ãŠããããã©ã®ããã«äœ¿çšãããããšãæå³ããŠãããã瀺ããŸãã
ãŠããããã¹ãã®ãã¹ããã©ã¯ãã£ã¹
- æåã«ãã¹ããæžãïŒãã¹ãé§åéçº - TDDïŒïŒ ã³ãŒããæžãåã«ãã¹ããæžããŸããããã«ãããèŠä»¶ã«éäžããã³ãŒãããã¹ãå¯èœã§ããããšãä¿èšŒã§ããŸãã
- åé¢ããŠãã¹ãããïŒ ã¢ãã¯ãã¹ã¿ããªã©ã®æè¡ã䜿çšããŠããã¹ã察象ã®ãŠãããããã®äŸåé¢ä¿ããåé¢ããŸãã
- æç¢ºã§ç°¡æœãªãã¹ããæžãïŒ ãã¹ãã¯çè§£ãããããä¿å®ãããããã®ã§ããã¹ãã§ãã
- ãšããžã±ãŒã¹ããã¹ãããïŒ å¢çæ¡ä»¶ãç¡å¹ãªå ¥åããã¹ãããŠãã³ãŒããããããé©åã«åŠçããããšã確èªããŸãã
- ãã¹ããé«éã«ä¿ã€ïŒ ãã¹ããé ããšãéçºè ãé »ç¹ã«å®è¡ããããšãããããå¯èœæ§ããããŸãã
- ãã¹ããèªååããïŒ ãã¹ãããã«ãããã»ã¹ã«çµ±åããã³ãŒãã倿Žããããã³ã«èªåçã«å®è¡ãããããã«ããŸãã
ãŠããããã¹ãã®ããŒã«ãšãã¬ãŒã ã¯ãŒã¯
ãŠããããã¹ããäœæãå®è¡ããã®ã«åœ¹ç«ã€ãããã€ãã®JavaScriptãã¹ããã¬ãŒã ã¯ãŒã¯ãå©çšå¯èœã§ãã人æ°ã®ããéžæè¢ã«ã¯ä»¥äžã®ãããªãã®ããããŸãã
- JestïŒ Facebookã«ãã£ãŠäœæãããã人æ°ã§å€æ©èœãªãã¹ããã¬ãŒã ã¯ãŒã¯ã§ãããŒãèšå®ã®ã»ããã¢ãããçµã¿èŸŒã¿ã®ã¢ãã¯æ©èœãã³ãŒãã«ãã¬ããžã¬ããŒããç¹åŸŽã§ããJestã¯ReactãVueãAngularãNode.jsã¢ããªã±ãŒã·ã§ã³ã®ãã¹ãã«é©ããŠããŸãã
- MochaïŒ ãã¹ããäœæãå®è¡ããããã®è±å¯ãªæ©èœãæäŸãããæè»ã§æ¡åŒµå¯èœãªãã¹ããã¬ãŒã ã¯ãŒã¯ã§ããChaiïŒã¢ãµãŒã·ã§ã³ã©ã€ãã©ãªïŒãSinon.JSïŒã¢ãã¯ã©ã€ãã©ãªïŒãªã©ã®è¿œå ã©ã€ãã©ãªãå¿ èŠã§ãã
- JasmineïŒ ä»æ§æžã®ããã«èªãããã¹ããæžãããšãéèŠãããããã€ãã¢é§åéçºïŒBDDïŒãã¬ãŒã ã¯ãŒã¯ã§ããçµã¿èŸŒã¿ã®ã¢ãµãŒã·ã§ã³ã©ã€ãã©ãªãå«ã¿ãã¢ãã¯ããµããŒãããŠããŸãã
- AVAïŒ é床ãšã·ã³ãã«ãã«çŠç¹ãåœãŠããããããªã¹ãã§æèŠã®å€ããã¹ããã¬ãŒã ã¯ãŒã¯ã§ããéåæãã¹ãã䜿çšããã¯ãªãŒã³ã§äœ¿ããããAPIãæäŸããŸãã
- TapeïŒ ã·ã³ãã«ããšå¯èªæ§ãéèŠãããã·ã³ãã«ã§è»œéãªãã¹ããã¬ãŒã ã¯ãŒã¯ã§ããæå°éã®APIãæã¡ãåŠç¿ãšäœ¿çšãç°¡åã§ãã
ãŠããããã¹ãã®äŸïŒJestïŒ
2ã€ã®æ°å€ãå ç®ããåçŽãªé¢æ°ã®äŸãèããŠã¿ãŸãããã
// add.js
function add(a, b) {
return a + b;
}
module.exports = add;
以äžã¯ãJestã䜿çšãããã®é¢æ°ã®ãŠããããã¹ãã§ãã
// add.test.js
const add = require('./add');
test('adds 1 + 2 to equal 3', () => {
expect(add(1, 2)).toBe(3);
});
test('adds -1 + 1 to equal 0', () => {
expect(add(-1, 1)).toBe(0);
});
ãã®äŸã§ã¯ãJestã®expect颿°ã䜿çšããŠadd颿°ã®åºåã«é¢ããã¢ãµãŒã·ã§ã³ãè¡ã£ãŠããŸããtoBeãããã£ãŒã¯ãå®éã®çµæãæåŸ
ãããçµæãšäžèŽãããã©ããããã§ãã¯ããŸãã
çµ±åãã¹ã
çµ±åãã¹ããšã¯äœãïŒ
çµ±åãã¹ãã¯ãã³ãŒãã®ç°ãªããŠããããã³ã³ããŒãã³ãéã®çžäºäœçšããã¹ãããããšã§ããåã ã®ãŠãããã«çŠç¹ãåœãŠããŠããããã¹ããšã¯ç°ãªããçµ±åãã¹ãã¯ãããã®ãŠããããçµã¿åãããããšãã«æ£ãã飿ºããŠåäœããããšã確èªããŸããç®æšã¯ãã¢ãžã¥ãŒã«éã§ããŒã¿ãæ£ããæµããã·ã¹ãã å šäœãæåŸ ã©ããã«æ©èœããããšã確èªããããšã§ãã
çµ±åãã¹ãã®å©ç¹
- çžäºäœçšã®æ€èšŒïŒ çµ±åãã¹ãã¯ãã·ã¹ãã ã®ç°ãªãéšåãæ£ãã飿ºããŠåäœããããšãä¿èšŒããŸãã
- ã€ã³ã¿ãŒãã§ãŒã¹ãšã©ãŒã®æ€åºïŒ ãããã®ãã¹ãã¯ãäžæ£ãªããŒã¿åãæ¬ èœãããã©ã¡ãŒã¿ãªã©ãã¢ãžã¥ãŒã«éã®ã€ã³ã¿ãŒãã§ãŒã¹ã®ãšã©ãŒãç¹å®ã§ããŸãã
- èªä¿¡ã®æ§ç¯ïŒ çµ±åãã¹ãã¯ãã·ã¹ãã å šäœãæ£ããæ©èœããŠãããšããèªä¿¡ãäžããŸãã
- å®äžçã®ã·ããªãªãžã®å¯Ÿå¿ïŒ çµ±åãã¹ãã¯ãè€æ°ã®ã³ã³ããŒãã³ããçžäºäœçšããå®äžçã®ã·ããªãªãã·ãã¥ã¬ãŒãããŸãã
çµ±åãã¹ãã®æŠç¥
çµ±åãã¹ãã«ã¯ã以äžãå«ãããã€ãã®æŠç¥ã䜿çšã§ããŸãã
- ãããããŠã³ãã¹ãïŒ ãããã¬ãã«ã®ã¢ãžã¥ãŒã«ããå§ããåŸã ã«äžäœã¬ãã«ã®ã¢ãžã¥ãŒã«ãçµ±åããŠãããŸãã
- ããã ã¢ãããã¹ãïŒ æäžäœã¬ãã«ã®ã¢ãžã¥ãŒã«ããå§ããåŸã ã«äžäœã¬ãã«ã®ã¢ãžã¥ãŒã«ãçµ±åããŠãããŸãã
- ããã°ãã³ãã¹ãïŒ ãã¹ãŠã®ã¢ãžã¥ãŒã«ãäžåºŠã«çµ±åããŸãããããã¯ãªã¹ã¯ãé«ããããã°ãå°é£ã«ãªãå¯èœæ§ããããŸãã
- ãµã³ãã€ãããã¹ãïŒ ãããããŠã³ãšããã ã¢ããã®ãã¹ãã¢ãããŒããçµã¿åãããŸãã
çµ±åãã¹ãã®ããŒã«ãšãã¬ãŒã ã¯ãŒã¯
çµ±åãã¹ãã«ã¯ããŠããããã¹ãã§äœ¿çšãããã®ãšåããã¹ããã¬ãŒã ã¯ãŒã¯ã䜿çšã§ããŸããããã«ãç¹ã«å€éšãµãŒãã¹ãããŒã¿ããŒã¹ãæ±ãå Žåã«ãçµ±åãã¹ãã«åœ¹ç«ã€å°éããŒã«ããããŸãã
- SupertestïŒ APIãšã³ããã€ã³ãã®ãã¹ãã容æã«ãããNode.jsçšã®é«ã¬ãã«HTTPãã¹ãã©ã€ãã©ãªã§ãã
- TestcontainersïŒ çµ±åãã¹ãã®ããã«ãããŒã¿ããŒã¹ãã¡ãã»ãŒãžãããŒã«ãŒããã®ä»ã®ãµãŒãã¹ã®è»œéã§äœ¿ãæšãŠã®ã€ã³ã¹ã¿ã³ã¹ãæäŸããã©ã€ãã©ãªã§ãã
çµ±åãã¹ãã®äŸïŒSupertestïŒ
æšæ¶ãè¿ãåçŽãªNode.js APIãšã³ããã€ã³ãã®äŸãèããŠã¿ãŸãããã
// app.js
const express = require('express');
const app = express();
const port = 3000;
app.get('/greet/:name', (req, res) => {
res.send(`Hello, ${req.params.name}!`);
});
app.listen(port, () => {
console.log(`Example app listening at http://localhost:${port}`);
});
module.exports = app;
以äžã¯ãSupertestã䜿çšãããã®ãšã³ããã€ã³ãã®çµ±åãã¹ãã§ãã
// app.test.js
const request = require('supertest');
const app = require('./app');
describe('GET /greet/:name', () => {
test('responds with Hello, John!', async () => {
const response = await request(app).get('/greet/John');
expect(response.statusCode).toBe(200);
expect(response.text).toBe('Hello, John!');
});
});
ãã®äŸã§ã¯ãSupertestã䜿çšããŠ`/greet/:name`ãšã³ããã€ã³ãã«HTTPãªã¯ãšã¹ããéä¿¡ããã¬ã¹ãã³ã¹ãæåŸ ã©ããã§ããããšã確èªããŠããŸããã¹ããŒã¿ã¹ã³ãŒããšã¬ã¹ãã³ã¹ããã£ã®äž¡æ¹ããã§ãã¯ããŠããŸãã
ãšã³ãããŒãšã³ãïŒE2EïŒãã¹ã
ãšã³ãããŒãšã³ãïŒE2EïŒãã¹ããšã¯äœãïŒ
ãšã³ãããŒãšã³ãïŒE2EïŒãã¹ãã¯ãå®éã®ãŠãŒã¶ãŒã€ã³ã¿ã©ã¯ã·ã§ã³ãã·ãã¥ã¬ãŒãããã¢ããªã±ãŒã·ã§ã³å šäœã®ãããŒãæåããæåŸãŸã§ãã¹ãããããšã§ãããã®ã¿ã€ãã®ãã¹ãã¯ãããã³ããšã³ããããã¯ãšã³ããããã³å€éšãµãŒãã¹ãããŒã¿ããŒã¹ãå«ãã·ã¹ãã ã®ãã¹ãŠã®éšåãæ£ãã飿ºããŠåäœããããšã確èªããŸããç®æšã¯ãã¢ããªã±ãŒã·ã§ã³ããŠãŒã¶ãŒã®æåŸ ã«å¿ãããã¹ãŠã®éèŠãªã¯ãŒã¯ãããŒãæ£ããæ©èœããŠããããšã確èªããããšã§ãã
E2Eãã¹ãã®å©ç¹
- å®éã®ãŠãŒã¶ãŒè¡åã®ã·ãã¥ã¬ãŒã·ã§ã³ïŒ E2Eãã¹ãã¯ãŠãŒã¶ãŒãã¢ããªã±ãŒã·ã§ã³ãšã©ã®ããã«å¯Ÿè©±ããããæš¡å£ãããã®æ©èœã®çŸå®çãªè©äŸ¡ãæäŸããŸãã
- ã·ã¹ãã å šäœã®æ€èšŒïŒ ãããã®ãã¹ãã¯ã¢ããªã±ãŒã·ã§ã³ãããŒå šäœãã«ããŒãããã¹ãŠã®ã³ã³ããŒãã³ããã·ãŒã ã¬ã¹ã«é£æºããããšãä¿èšŒããŸãã
- çµ±ååé¡ã®æ€åºïŒ E2Eãã¹ãã¯ãããã³ããšã³ããšããã¯ãšã³ããªã©ãã·ã¹ãã ã®ç°ãªãéšåéã®çµ±ååé¡ãç¹å®ã§ããŸãã
- èªä¿¡ã®æäŸïŒ E2Eãã¹ãã¯ãã¢ããªã±ãŒã·ã§ã³ããŠãŒã¶ãŒã®èŠç¹ããæ£ããåäœããŠãããšããé«ãã¬ãã«ã®èªä¿¡ãæäŸããŸãã
E2Eãã¹ãã®ããŒã«ãšãã¬ãŒã ã¯ãŒã¯
E2Eãã¹ããäœæãå®è¡ããããã«ãããã€ãã®ããŒã«ãšãã¬ãŒã ã¯ãŒã¯ãå©çšå¯èœã§ãã人æ°ã®ããéžæè¢ã«ã¯ä»¥äžã®ãããªãã®ããããŸãã
- CypressïŒ é«éã§ä¿¡é Œæ§ã®é«ããã¹ãäœéšãæäŸãããã¢ãã³ã§ãŠãŒã¶ãŒãã¬ã³ããªãŒãªE2Eãã¹ããã¬ãŒã ã¯ãŒã¯ã§ããã¿ã€ã ãã©ãã«ãããã°ãèªååŸ æ©ããªã¢ã«ã¿ã€ã ãªããŒããªã©ã®æ©èœãåããŠããŸãã
- SeleniumïŒ è€æ°ã®ãã©ãŠã¶ãšããã°ã©ãã³ã°èšèªããµããŒããããåºã䜿çšãããŠãã倿©èœãªãã¹ããã¬ãŒã ã¯ãŒã¯ã§ããCypressãããå€ãã®èšå®ãå¿ èŠã§ãããããé«ãæè»æ§ãæäŸããŸãã
- PlaywrightïŒ Microsoftã«ãã£ãŠéçºãããæ¯èŒçæ°ããE2Eãã¹ããã¬ãŒã ã¯ãŒã¯ã§ãè€æ°ã®ãã©ãŠã¶ããµããŒãããWebããŒãžãšå¯Ÿè©±ããããã®è±å¯ãªæ©èœãæäŸããŸãã
- PuppeteerïŒ Googleã«ãã£ãŠéçºãããNode.jsã©ã€ãã©ãªã§ããããã¬ã¹ã®ChromeãŸãã¯Chromiumãå¶åŸ¡ããããã®é«ã¬ãã«APIãæäŸããŸããE2Eãã¹ããWebã¹ã¯ã¬ã€ãã³ã°ãèªååã«äœ¿çšã§ããŸãã
E2Eãã¹ãã®äŸïŒCypressïŒ
Cypressã䜿çšããE2Eãã¹ãã®ç°¡åãªäŸãèããŠã¿ãŸãããããŠãŒã¶ãŒåãšãã¹ã¯ãŒãã®ãã£ãŒã«ããããã³éä¿¡ãã¿ã³ããããã°ã€ã³ãã©ãŒã ããããšããŸãã
// login.test.js
describe('Login Form', () => {
it('should successfully log in', () => {
cy.visit('/login');
cy.get('#username').type('testuser');
cy.get('#password').type('password123');
cy.get('button[type="submit"]').click();
cy.url().should('include', '/dashboard');
cy.contains('Welcome, testuser!').should('be.visible');
});
});
ãã®äŸã§ã¯ãCypressã³ãã³ãã䜿çšããŠæ¬¡ã®ããšãè¡ã£ãŠããŸãã
cy.visit('/login')ïŒãã°ã€ã³ããŒãžã«ã¢ã¯ã»ã¹ããŸããcy.get('#username').type('testuser')ïŒãŠãŒã¶ãŒåãã£ãŒã«ãã«ãtestuserããšå ¥åããŸããcy.get('#password').type('password123')ïŒãã¹ã¯ãŒããã£ãŒã«ãã«ãpassword123ããšå ¥åããŸããcy.get('button[type="submit"]').click()ïŒéä¿¡ãã¿ã³ãã¯ãªãã¯ããŸããcy.url().should('include', '/dashboard')ïŒãã°ã€ã³æååŸãURLã«ã/dashboardããå«ãŸããŠããããšãã¢ãµãŒãããŸããcy.contains('Welcome, testuser!').should('be.visible')ïŒãŠã§ã«ã«ã ã¡ãã»ãŒãžãããŒãžã«è¡šç€ºãããŠããããšãã¢ãµãŒãããŸãã
ãŠããã vs çµ±å vs E2EïŒãŸãšã
以äžã¯ããŠããããçµ±åãE2Eãã¹ãã®äž»ãªéãããŸãšãã衚ã§ãã
| ãã¹ãã®çš®é¡ | çŠç¹ | ã¹ã³ãŒã | é床 | ã³ã¹ã | ããŒã« |
|---|---|---|---|---|---|
| ãŠããããã¹ã | åã ã®ãŠããããŸãã¯ã³ã³ããŒãã³ã | æå° | æé | æäœ | Jest, Mocha, Jasmine, AVA, Tape |
| çµ±åãã¹ã | ãŠãããéã®çžäºäœçš | äž | äž | äž | Jest, Mocha, Jasmine, Supertest, Testcontainers |
| E2Eãã¹ã | ã¢ããªã±ãŒã·ã§ã³å šäœã®ãã㌠| æå€§ | æé | æé« | Cypress, Selenium, Playwright, Puppeteer |
åãã¹ãã¿ã€ãããã€äœ¿çšããã
ã©ã®ã¿ã€ãã®ãã¹ãã䜿çšãããã®éžæã¯ããããžã§ã¯ãã®ç¹å®ã®èŠä»¶ã«äŸåããŸãã以äžã«äžè¬çãªã¬ã€ãã©ã€ã³ã瀺ããŸãã
- ãŠããããã¹ãïŒ ã³ãŒãã®ãã¹ãŠã®åã ã®ãŠããããŸãã¯ã³ã³ããŒãã³ãã«å¯ŸããŠãŠããããã¹ãã䜿çšããŸããããã¯ãã¹ãæŠç¥ã®åºç€ãšãªãã¹ãã§ãã
- çµ±åãã¹ãïŒ ç¹ã«å€éšãµãŒãã¹ãããŒã¿ããŒã¹ãæ±ãå Žåã«ãç°ãªããŠããããã³ã³ããŒãã³ããæ£ãã飿ºããŠåäœããããšã確èªããããã«çµ±åãã¹ãã䜿çšããŸãã
- E2Eãã¹ãïŒ ãŠãŒã¶ãŒã®èŠç¹ããã¢ããªã±ãŒã·ã§ã³å šäœã®ãããŒãæ£ããæ©èœããŠããããšã確èªããããã«E2Eãã¹ãã䜿çšããŸããéèŠãªã¯ãŒã¯ãããŒãšãŠãŒã¶ãŒãžã£ãŒããŒã«çŠç¹ãåœãŠãŸãã
äžè¬çãªã¢ãããŒãã¯ããã¹ããã©ãããã«åŸãããšã§ããããã¯ã倿°ã®ãŠããããã¹ããäžçšåºŠã®æ°ã®çµ±åãã¹ãããããŠå°æ°ã®E2Eãã¹ããæã€ããšãææ¡ããŠããŸãã
ãã¹ããã©ããã
ãã¹ããã©ãããã¯ããœãããŠã§ã¢ãããžã§ã¯ãã«ãããç°ãªãã¿ã€ãã®ãã¹ãã®çæ³çãªå²åã衚ãèŠèŠçãªã¡ã¿ãã¡ãŒã§ããããã¯ã以äžã®ããã«ããããšãææ¡ããŠããŸãã
- åºç¯ãªããŒã¹ã®ãŠããããã¹ãïŒ ãããã®ãã¹ãã¯éããå®äŸ¡ã§ãä¿å®ã容æãªããã倿°æã€ã¹ãã§ãã
- ããå°ããªå±€ã®çµ±åãã¹ãïŒ ãããã®ãã¹ãã¯ãŠããããã¹ããããè€éã§é«äŸ¡ãªãããæ°ã¯å°ãªããã¹ãã§ãã
- çãé ç¹ã®E2Eãã¹ãïŒ ãããã®ãã¹ãã¯æãè€éã§é«äŸ¡ãªãããæãå°ãªããã¹ãã§ãã
ãã©ãããã¯ãã¢ããªã±ãŒã·ã§ã³ã®ç¹å®ã®é åã«è¿œå ã®ã«ãã¬ããžãæäŸããçµ±åãã¹ããšE2Eãã¹ããšãšãã«ãäž»èŠãªãã¹ã圢åŒãšããŠãŠããããã¹ãã«çŠç¹ãåœãŠãããšã®éèŠæ§ã匷調ããŠããŸãã
ãã¹ãã«ãããã°ããŒãã«ãªèæ ®äºé
ã°ããŒãã«ãªãªãŒãã£ãšã³ã¹åãã®ãœãããŠã§ã¢ãéçºããå Žåããã¹ãäžã«ä»¥äžã®èŠçŽ ãèæ ®ããããšãäžå¯æ¬ ã§ãã
- ããŒã«ãªãŒãŒã·ã§ã³ïŒL10nïŒïŒ ããã¹ããæ¥ä»ãé貚ããã®ä»ã®ãã±ãŒã«åºæã®èŠçŽ ãæ£ãã衚瀺ãããããšã確èªããããã«ãç°ãªãèšèªãå°åèšå®ã§ã¢ããªã±ãŒã·ã§ã³ããã¹ãããŸããäŸãã°ãæ¥ä»åœ¢åŒããŠãŒã¶ãŒã®å°åã«å¿ããŠè¡šç€ºãããããšã確èªããŸãïŒäŸïŒç±³åœã®MM/DD/YYYY vs ãšãŒãããã®DD/MM/YYYYïŒã
- åœéåïŒI18nïŒïŒ ã¢ããªã±ãŒã·ã§ã³ãç°ãªãæåãšã³ã³ãŒãã£ã³ã°ïŒäŸïŒUTF-8ïŒããµããŒãããæ§ã ãªèšèªã®ããã¹ããåŠçã§ããããšã確èªããŸããäžåœèªãæ¥æ¬èªãéåœèªãªã©ãç°ãªãæåã»ããã䜿çšããèšèªã§ãã¹ãããŸãã
- ã¿ã€ã ãŸãŒã³ïŒ ã¢ããªã±ãŒã·ã§ã³ãã¿ã€ã ãŸãŒã³ãšå€æéãã©ã®ããã«åŠçãããããã¹ãããŸããç°ãªãã¿ã€ã ãŸãŒã³ã®ãŠãŒã¶ãŒã«å¯ŸããŠæ¥ä»ãšæå»ãæ£ãã衚瀺ãããããšã確èªããŸãã
- éè²šïŒ ã¢ããªã±ãŒã·ã§ã³ãéèååŒã䌎ãå Žåãè€æ°ã®é貚ããµããŒãããé貚èšå·ããŠãŒã¶ãŒã®ãã±ãŒã«ã«å¿ããŠæ£ãã衚瀺ãããããšã確èªããŸãã
- ã¢ã¯ã»ã·ããªãã£ïŒ é害ãæã€äººã ã䜿çšã§ããããã«ãã¢ããªã±ãŒã·ã§ã³ã®ã¢ã¯ã»ã·ããªãã£ããã¹ãããŸããWCAGïŒWeb Content Accessibility GuidelinesïŒãªã©ã®ã¢ã¯ã»ã·ããªãã£ã¬ã€ãã©ã€ã³ã«åŸããŸãã
- æåçãªé æ ®ïŒ æåçãªéãã«æ³šæããç¹å®ã®æåã§äžå¿«ãŸãã¯äžé©åãšèŠãªãããå¯èœæ§ã®ããç»åãèšå·ããŸãã¯èšèã®äœ¿çšãé¿ããŸãã
- æ³çã³ã³ãã©ã€ã¢ã³ã¹ïŒ ããŒã¿ãã©ã€ãã·ãŒæ³ïŒäŸïŒGDPRïŒãã¢ã¯ã»ã·ããªãã£æ³ïŒäŸïŒADAïŒãªã©ã䜿çšãããåœã®é¢é£ãããã¹ãŠã®æ³åŸããã³èŠå¶ã«ã¢ããªã±ãŒã·ã§ã³ãæºæ ããŠããããšã確èªããŸãã
çµè«
é©åãªãã¹ãæŠç¥ãéžæããããšã¯ãå ç¢ã§ä¿¡é Œæ§ã®é«ãJavaScriptã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã«äžå¯æ¬ ã§ãããŠããããã¹ããçµ±åãã¹ããE2Eãã¹ãã¯ãããããã³ãŒãã®å質ãä¿èšŒããäžã§éèŠãªåœ¹å²ãæãããŸãããããã®ãã¹ãã¿ã€ãã®éããçè§£ãããã¹ããã©ã¯ãã£ã¹ã«åŸãããšã§ããããžã§ã¯ãã®ç¹å®ã®ããŒãºã«åã£ãå æ¬çãªãã¹ãæŠç¥ãäœæã§ããŸããäžçäžã®ãªãŒãã£ãšã³ã¹åãã®ãœãããŠã§ã¢ãéçºããéã¯ãããŒã«ãªãŒãŒã·ã§ã³ãåœéåãã¢ã¯ã»ã·ããªãã£ãªã©ã®ã°ããŒãã«ãªèŠçŽ ãèæ ®ããããšãå¿ããªãã§ãã ããããã¹ãã«æè³ããããšã§ããã°ãæžãããã³ãŒãå質ãåäžããããŠãŒã¶ãŒæºè¶³åºŠãé«ããããšãã§ããŸãã